"""
索引操作
"""
import os
import sys

path = os.path.dirname(__file__)
sys.path.append(os.path.join(path, '..'))

import re
import json
import pymongo
from pymongo import collection
from conf.mongo_conf import BASIC_DATA_DB
from conf.config import COMPANY_STAFFS_LIST


class IndexDocument(object):
    company_staffs = BASIC_DATA_DB[COMPANY_STAFFS_LIST]

    def get_indexes(self):
        """
        获取当前集合中已经创建的所有索引信息
        示例：SON([('v', 2), ('key', SON([('_id', 1)])), ('name', '_id_')])
        v: 索引版本
        key：索引的字段及排序方向(1表示升序，-1表示降序)
        name：索引的名称
        """
        results = self.company_staffs.list_indexes()
        for result in results:
            print(result)

    def create_one_field_index(self):
        """创建单个字段索引-普通索引"""
        # 将：age字段，升序创建索引，索引名称为：age
        # 建索引过程会阻塞其它数据库操作，background可指定以后台方式创建索引
        self.company_staffs.create_index([('age', pymongo.ASCENDING)], background=True, name='age')

    def create_multiple_field_index(self):
        """创建多个字段索引"""
        # 将：job、native_place_address，创建全文索引
        # 建索引过程会阻塞其它数据库操作，background可指定以后台方式创建索引
        self.company_staffs.create_index([
            ('job', pymongo.TEXT),
            ('native_place_address', pymongo.TEXT)
        ], background=True)

    def drop_field_index(self, index_name: str = ''):
        """删除字段索引"""
        if not isinstance(index_name, str) or not index_name:
            return
        self.company_staffs.drop_index(index_name)

    def get_indexes_data(self):
        """查询索引数据"""
        documents = self.company_staffs.find({'age': 22}).explain()
        print(json.dumps(documents, indent=4, ensure_ascii=False))
        # for document in documents:
        #     print(document)

    def get_multiple_field_data(self):
        """查询多个字段索引数据"""
        documents = self.company_staffs.find(
            {
                'job': {'$regex': re.compile(r'^.*?网络.*?$', re.DOTALL)},
                # 'native_place_address': {'$regex': re.compile(r'^.*?贵州.*?$', re.DOTALL)}
             }
        ).explain()     # 查询工作关键字含：网络，籍贯地址关键字含：贵州，数据
        print(json.dumps(documents, indent=4, ensure_ascii=False))
        # documents = self.company_staffs.find({'job': {'$regex': re.compile(r'^.*?网络.*?$', re.DOTALL)}})
        # for document in documents:
        #     print(document)

    def run(self):
        self.get_indexes()  # 获取当前集合中已经创建的所有索引信息
        # TODO 单索引
        self.create_one_field_index()  # 创建单个字段索引-普通索引
        self.drop_field_index('age')    # 删除字段索引
        self.get_indexes_data()  # 查询索引数据
        # TODO 多个索引
        self.create_multiple_field_index()  # 创建多个字段索引
        self.get_multiple_field_data()  # 查询多个字段索引数据
        # TODO 测试清除索引
        # self.drop_field_index('age')
        # self.drop_field_index('job_text')


if __name__ == '__main__':
    index_document = IndexDocument()
    index_document.run()
